From: Jan Beulich Date: Mon, 26 Nov 2012 16:20:39 +0000 (+0100) Subject: x86/time: fix scale_delta() inline assembly X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~7616 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/success//%22http:/www.example.com/cgi/success/?a=commitdiff_plain;h=84628ee52a427b0f0fe50502eb8ffd0eedad0f03;p=xen.git x86/time: fix scale_delta() inline assembly The way it was coded, it clobbered %rdx without telling the compiler. This generally didn't cause any problems except when there are two back to back invocations (as in plt_overflow()), as in that case the compiler may validly assume that it can re-use for the second instance the value loaded into %rdx before the first one. Once at it, also properly relax the second operand of "mul" (there's no need for it to be in %rdx, or a register at all), and switch away from using explicit register names in the instruction operands. Signed-off-by: Jan Beulich Acked-by: Keir Fraser --- diff --git a/xen/arch/x86/time.c b/xen/arch/x86/time.c index 995e3bb9a9..6708740d1c 100644 --- a/xen/arch/x86/time.c +++ b/xen/arch/x86/time.c @@ -127,8 +127,9 @@ static inline u64 scale_delta(u64 delta, struct time_scale *scale) delta <<= scale->shift; asm ( - "mul %%rdx ; shrd $32,%%rdx,%%rax" - : "=a" (product) : "0" (delta), "d" ((u64)scale->mul_frac) ); + "mul %2 ; shrd $32,%1,%0" + : "=a" (product), "=d" (delta) + : "rm" (delta), "0" ((u64)scale->mul_frac) ); return product; }